package com.fmm.medium;

public class TwoCirclesIntersect {
    /**
     * 两圆相交
     * a. 给定两个圆的圆⼼坐标 (x1, y1) 和 (x2, y2) ，以及半径 m 和 n ，计算两圆重叠 区域的⾯积。
     * b. 若两圆⽆重叠，返回 0 ；若完全重叠（同⼼且半径相同），返回圆的⾯积。
     */
    public static double calArea(double x1, double y1, double x2, double y2, double m, double n) {
        // 知道三角形三边，求某一个角的角度公式：cos角度 = (两边平方和 - 第三边平方)/(2 * 两边乘积)
        // 三角形面积：sin角度 * 两边乘积
        // 求出两个圆心距离
        double d = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
        if (d >= m + n) {
            return 0;
        }
        if (Math.max(m, n) - Math.min(m, n) >= d) {
            return Math.PI * Math.pow(Math.min(m, n), 2);
        }
        double angle1 = Math.acos((Math.pow(m, 2) + Math.pow(d, 2) - Math.pow(n, 2)) / (2 * m * d));
        double angle2 = Math.acos((Math.pow(n, 2) + Math.pow(d, 2) - Math.pow(m, 2)) / (2 * n * d));
        double c1 = Math.PI * Math.pow(m, 2);
        double c2 = Math.PI * Math.pow(n, 2);
        double cp1 = c1 * ((2 * angle1) / (2 * Math.PI));
        double cp2 = c2 * ((2 * angle2) / (2 * Math.PI));

        double t = Math.sin(angle1) * m * d / 2;
        double result = cp1 + cp2 - 2 * t;
        return result;
    }

    public static void main(String[] args) {
        System.out.println(calArea(0, 0, 1, 0, 0.6, 0.6));
        System.out.println(calArea(0, 0, 1, 0, 1.5, 0.5));
        System.out.println(calArea(0, 0, 1, 0, 2, 0.5));
        System.out.println(calArea(0, 0, 1, 0, 0.5, 0.5));
        System.out.println(calArea(0, 0, 1, 0, 0.4, 0.5));
    }
}
